package p6sort;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.util.Version;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

/**
 * 默认的排序有一定的缺陷，比如，按关键字“java”搜索（目的想搜java书，想搜最近一年的），如果按日期排序，
 * (比如九几年的书，在2018 年上传，也会排前面)，这种情况下我们可以自定义评分和排序 见p8
 */
public class TestSort {
    private SearchUtils searchUtils;
    @Before
    public void setUp(){
        searchUtils =new SearchUtils();
    }

    /**
     * //1，不传排序，默认是以socre排序(疑问，和SortFile.FIELD_SCORE评分排序有啥不同（）)
     */
    @Test
    public void test1() throws ParseException, IOException {
        //默认搜索域为content,可以修改
        QueryParser parse=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
        Query query=parse.parse("home");

        searchUtils.searchSort(query,100,null);
    }


    /**
     * 2，以序号排序
     * 也就是通过document的id进行排序
     * 注意传了sort后 评分就变成NaN了
     * @throws Exception
     */
    @Test
    public void test2() throws Exception {
        QueryParser parse=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
        Query query=parse.parse("home");
        //以序号排序
        searchUtils.searchSort(query,100, Sort.INDEXORDER);
    }

    /**
     *
     */
    @Test
    public void test3() throws Exception {
        QueryParser parse=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
        Query query=parse.parse("home");
        //这个其实就是sort 传null一样的，使用默认的评分排序
        //注意传了sort后 评分就变成NaN了，所以默认的评分就不要传下面的这个值了
        searchUtils.searchSort(query,100, Sort.RELEVANCE);
    }

    /**
     * 指定字段排序(通过SortField)
     */
    @Test
    public void test4() throws Exception {
        QueryParser parse=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
        Query query=parse.parse("home");
        //SortField.STRING 表示字段类型
        searchUtils.searchSort(query,100, new Sort(new SortField("atache",SortField.INT)));
    }

    /**
     * 指定字段排序(通过SortField)
     * 默认是升序，通过构造函数的第三个参数，可以改升序，降序
     *
     */
    @Test
    public void test5() throws Exception {
        QueryParser parse=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
        Query query=parse.parse("home");
        //SortField.STRING 表示字段类型
        searchUtils.searchSort(query,100, new Sort(new SortField("atache",SortField.INT,true)));
    }

    /**
     * 多个字段排序 （也是通过构造方法的）
     *
     */
    @Test
    public void test6() throws Exception {
        QueryParser parse=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
        Query query=parse.parse("home");
        //SortField.STRING 表示字段类型
        searchUtils.searchSort(query,100, new Sort(new SortField("atache",SortField.INT,true),
                new SortField("name",SortField.STRING,true)));
    }
}
